package cn.aiyuan.service.impl;

import cn.aiyuan.mapper.UserMapper;
import cn.aiyuan.pojo.User;
import cn.aiyuan.service.AsyncTaskService;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;

/**
 * @author wy
 * @date 2020/9/30
 */
@Service
@Slf4j
public class AsyncTaskServiceImpl implements AsyncTaskService {


    @Resource
    private UserMapper userMapper;


    /**
     * 分批次异步导出数据
     * @param map 要导出的批次数据信息
     * @param cdl countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
     */
    @Async("excelExecutor")
    public void executeAsyncTask(Map<String, Object> map, CountDownLatch cdl) throws IOException {
        long start = System.currentTimeMillis();
        // 导出文件路径
        List<User> list = null;
        try {
            //PageUtil.pageUtil(map);
            //查询要导出的批次数据
            Page<User> page = new Page<>(Long.parseLong(map.get("page").toString()), Long.parseLong(map.get("limit").toString()));
            list = userMapper.selectPage(page, null).getRecords();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 写法1
        String filepath = map.get("path").toString() + map.get("page") + ".xlsx";
        File file = new File(filepath); // D:\excel\
        //if (!file.exists()) file.createNewFile();

        File fileParent = file.getParentFile(); //返回的是File类型,可以调用exsit()等方法
        String fileParentPath = file.getParent(); //返回的是String类型
        System.out.println("fileParent:" + fileParent);
        System.out.println("fileParentPath:" + fileParentPath);
        if (!fileParent.exists()) fileParent.mkdirs();// 能创建多级目录
        if (!file.exists())  file.createNewFile();//有路径才能创建文件

        // 这里 需要指定写用哪个class去读，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        EasyExcel.write(filepath, User.class).sheet(map.get("page").toString()).doWrite(list);
        long end = System.currentTimeMillis();
        log.info("线程：" + Thread.currentThread().getName() + " , 导出excel   " + map.get("page") + ".xlsx   成功 , 导出数据 " + list.size() + " ,耗时 ：" + (end - start));
        list.clear();
        //执行完毕线程数减一
        cdl.countDown();
        log.info("剩余任务数  ===========================> " + cdl.getCount());

    }



}
